package com.onion.orm.dao;

import com.onion.orm.support.filter.QueryData;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

@SuppressWarnings("all")
public interface EnhancedDao<T, PK extends Serializable> {

    /**
     * 插入并返回插入后的bean(尤其适用有自增主键时)
     * @param entity
     * @return
     */
    T insertAndReturn(T entity);

    /**
     * 批量插入并返回插入后的bean(尤其适用有自增主键时)
     * @param entityList
     * @return
     */
    List<T> insertAndReturn(List<T> entityList);

    /**
     * 批量插入
     * @param entityList
     * @return
     */
    int insertBatch(List<T> entityList);

    /**
     * 批量更新
     * @param entityList
     */
    int updateBatch(List<T> entityList);

    /**
     * 插入并返回插入后的bean(尤其适用有自增主键时)
     * @param entity
     * @return
     */
    T replaceAndReturn(T entity);

    /**
     * 批量插入并返回插入后的bean(尤其适用有自增主键时)
     * @param entityList
     * @return
     */
    List<T> replaceAndReturn(List<T> entityList);

    /**
     * 修改更新
     * @param bean
     * @return
     */
    int update(T bean);

    /**
     * 根据条件修改
     * @param data
     * @param queryData
     * @return
     */
    //public int update(Map<String, UpdateEntry> data, QueryData queryData);

    /**
     * 批量更新
     * @param beanList
     * @return
     */
    int update(List<T> beanList);

    /**
     * 主键删除
     * @param id
     * @return
     */
    int delete(PK id);

    /**
     * 主键删除
     * @param keyList
     * @return
     */
    int delete(List<PK> keyList);

    /**
     * 根据条件删除
     * 目前在批量删除为了安全，最多一次删除行数被限制为了1000，后续根据实际使用场景进行调整
     * @param queryData
     * @return
     */
    int delete(QueryData queryData);

    /**
     * 多个主键查询
     *
     * @param keys
     * @return
     */
    List<T> find(List<PK> keys);

    /**
     *
     * @param queryData
     * @return
     */
    List<T> find(QueryData queryData);

    /**
     * 根据指定列值查询
     *
     * @param name
     * @param val
     * @return
     */
    <TT> List<T> find(String name, TT val, int limit);

    /**
     * 指定列来查询，注意，本方法因为可以直接定义查询列
     * @param fields 指定查询列
     * @param queryData
     * @return
     */
    List<Map<String, Object>> find(String fields, QueryData queryData);

    /**
     * 单个主键查询
     * @param key
     * @return
     */
    T get(PK key);

    /**
     * 单个查询
     * @param queryData
     * @return
     */
    T get(QueryData queryData);

    /**
     * 指定列的值查询，多条匹配只返回第1个，没找到返回null
     * @param name
     * @param val
     * @return
     */
    <TT> T get(String name, TT val);

    /**
     * 单列条件计数
     * @param fieldName
     * @param value
     * @return
     */
    <TT> int count(String fieldName, TT value);

    /**
     * 查询总数
     * @param queryData
     * @return
     */
    int count(QueryData queryData);

    /**
     * sum合计
     * @param fieldName
     * @param queryData
     * @return
     */
    int sum(String fieldName, QueryData queryData);


    /**
     * 获取sqlSession，用于自定义操作
     * 这里为了规避dao-api依赖mybatis包，先用范型声明
     * @return
     */
    <TT> TT getSqlSession();

}